#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qextserialport.h"
#include "ui_mainwindow.h"
#include "settingsdialog.h"
#include "db.h"
#include <QDebug>

class QUdpSocket;

class AdapterSerialPort : public QMainWindow,public Ui::MainWindow
{
    Q_OBJECT
public:
    explicit AdapterSerialPort(QWidget *parent = 0);
    ~AdapterSerialPort();
    /*解析数据，将结果写入数据库。如果isEvent为true，表示是事件型传感器数据；
    否则为普通传感器数据。      */
    void statistic(bool isEvent);
private:

    /*数据包处理，该函数被readMyCom()调用。它自己会调用statistic()
    需要注意的是，在调用该函数前，数据temp应当已经转换为了Hex
    如果isFromUDP为真，表明数据是从UDP得来的，该包一般是从IOTServer转发过来的。
    对于此类包，无需生成心跳包后发给IOTServer，否则，IOTServer会把数据包的源当做是
    databasecom，而不是telnetclient，导致一些命令不能被正确下发到telnetclient
    */
    void  packetAnalyze(bool isFromUDP);
    QextSerialPort *myCom;
    PortSettings  *myPortSettings;
    QString  *myPortName;
    settingsDialog *Dialog;
    DatabaseOperation* dbo;
    QByteArray* temp; //串口接收到的数据
    QUdpSocket *udpSocket;

    //每隔几个小时对数据库进行次操作，避免：MySQL has gone away
    QTimer* timerForKeepDBConnect;
    quint32 packetLen;

signals:
    void sigInfo(QString info); //需要显示的信息
    void sigPacketNodeToServer(QByteArray datagram,QHostAddress GWIP,
             quint16  GWPort,bool isFromTcp); //GWIP是指Sink的IP，此处即为telnet适配器的IP

private slots:
    //void slotShowInfo(QString info);
    //void slotTimerQueryDB();
    void on_checkBoxNor_toggled(bool checked);
    void on_checkBoxNor_clicked();
    void on_exitBtn_clicked();
    void on_clearBtn_clicked();
    void setPortSettings(const PortSettings& portSettings);
    void setPortName(const QString&);
    void on_settingsBtn_clicked();
    void on_sendMsgBtn_clicked();
    void on_closeComBtn_clicked();
    void on_openComBtn_clicked();
    void readMyCom();
    void readUDPPacket();
    void on_pushButtonHide_clicked();
};

#endif // MAINWINDOW_H
